#include "RealTimeData.h"
#include "format.h"

#define _f(str) util::Format(str, n)

// 初始化
RealTimeData::RealTimeData()
{
    // sms
    int i = 0;
    for (i = 0; i < 15; i++)
    {
        int n = i + 1;
        SMS_CHn_S[i] = {_f("SMS_CH{0}_S"), {_f("通道 {0} 状态"), _f("SMS_CH{0}_S"), "0 断开 1 连接"}};
        SMS_CHn_I[i] = {_f("SMS_CH{0}_I"), {_f("通道 1 电流值"), _f("SMS_CH1_I"), ""}};
        SMS_CHn_ERR[i] = {_f("SMS_CH{0}_ERR"), {_f("通道 1 电流故障状态"), _f("SMS_CH1_ERR"), "0 正常 1 过载 2 过流"}};
        SMS_CHn_ERRV[i] = {_f("SMS_CH{0}_ERRV"), {_f("通道 1 电流故障值"), _f("SMS_CH1_ERRV"), ""}};
        SMS_CHn_KWH[i] = {_f("SMS_CH{0}_KWH"), {_f("通道 1 累积电能"), _f("SMS_CH1_KWH"), ""}};
    }
    // gnss
    for (i = 0; i < 10; i++)
    {
        int n = i + 1;
        GNSSn_S[i] = {_f("GNSS{0}_S"), {_f("GNSS{0} 设备在线状态"), _f("GNSS{0}_S"), " 0 正常 1 掉线 "}};
        GNSSn_N_T[i] = {_f("GNSS{0}_N_T"), {_f("GNSS{0} 最近一次数据时间"), _f("GNSS{0}_N_T"), "（时间戳格式）"}};
        GNSSn_ITEM[i] = {_f("GNSS{0}_ITEM"), {_f("GNSS{0} 当日报文条目数量"), _f("GNSS{0}_ITEM"), ""}};
        GNSSn_SIZE[i] = {_f("GNSS{0}_SIZE"), {_f("GNSS{0} 当日报文字节大小"), _f("GNSS{0}_SIZE"), ""}};
    }

    // DAM
    for (i = 0; i < 6; i++)
    {
        int n = i + 1;
        DAMn_S[i] = {_f("DAM{0}_S"), {_f("大坝安全设备 {0} 在线状态"), _f("DAM{0}_S"), " 0 正常 1 掉线"}};
        DAMn_N_T[i] = {_f("DAM{0}_N_T"), {_f("大坝安全监测 {0} 最近一次数据时间"), _f("DAM{0}_N_T"), ""}};
    }
    // cam
    for (i = 0; i < 10; i++)
    {
        int n = i + 1;
        CAMn_S[i] = {_f("CAM{0}_S"), {_f("摄像机 {0} 状态="), _f("CAM{0}_S"), "0 正常 1 掉线 "}};
        CAMn_OFF_TM[i] = {_f("CAM{0}_OFF_TM"), {_f("摄像机 {0} 离线时间"), _f("CAM{0}_OFF_TM"), "时间戳格式"}};
    }
}

// 定义tojson string
#define __Define_RTD_S(x) plist.push_back(&x);
#define __Define_tostring(name, Macro)                             \
    int RealTimeData::name(std::vector<RealTimeDataItem *> &plist) \
    {                                                              \
        /*std::vector<RealTimeDataItem *> plist; */                \
        Macro(__Define_RTD_S);                                     \
        return plist.size();                                       \
    }
__Define_tostring(to_inv_solar, __Inv_Solar_Data); // 逆变-太阳能
__Define_tostring(to_meter, __Meter_Data);         // 电表
__Define_tostring(to_duanluqi, __Duanluqi_Data);   // 断路器
__Define_tostring(to_pingan, __pingan_Data);       // 平安报
__Define_tostring(to_yu, __Yu_Data);               // 雨量水位
__Define_tostring(to_water, __Water_Data);         // 水位 水位预警
__Define_tostring(to_ht, __HT_Data);               // 箱内温湿
__Define_tostring(to_od, __OD_Data);               // 开箱
__Define_tostring(to_tc_hc, __TC_HC_Data);         // 温湿
__Define_tostring(to_ib, __IB_Data);               // 进线断路器
                                                   //
// SMS [num]
int RealTimeData::to_sms(int num, std::vector<RealTimeDataItem *> &plist)
{
    __SmartSwitch_Data(__Define_RTD_S);
    for (int i = 0; i < num; i++)
    {
        plist.push_back(&SMS_CHn_S[i]);
        plist.push_back(&SMS_CHn_I[i]);
        plist.push_back(&SMS_CHn_ERR[i]);
        plist.push_back(&SMS_CHn_ERRV[i]);
        plist.push_back(&SMS_CHn_KWH[i]);
    }
    return plist.size();
}

// GNSS[]
int RealTimeData::to_gnss(int num, std::vector<RealTimeDataItem *> &plist)
{
    for (int i = 0; i < num; i++)
    {
        plist.push_back(&GNSSn_S[i]);
        plist.push_back(&GNSSn_N_T[i]);
        plist.push_back(&GNSSn_ITEM[i]);
        plist.push_back(&GNSSn_SIZE[i]);
    }
    return plist.size();
}

// DAM[]
int RealTimeData::to_dam(int num, std::vector<RealTimeDataItem *> &plist)
{
    for (int i = 0; i < num; i++)
    {
        plist.push_back(&DAMn_S[i]);
        plist.push_back(&DAMn_N_T[i]);
    }
    return plist.size();
}

// Cam[]
int RealTimeData::to_cam(int num, std::vector<RealTimeDataItem *> &plist)
{
    plist.push_back(&NVR_S);
    plist.push_back(&NVR_OFF_TM);
    for (int i = 0; i < num; i++)
    {
        plist.push_back(&CAMn_S[i]);
        plist.push_back(&CAMn_OFF_TM[i]);
    }
    return plist.size();
}

/*sms[15]*/
/*gnss[10]*/
/*DAM[6]*/
/*Cam[10]*/
// all data
int RealTimeData::to_all(std::vector<RealTimeDataItem *> &plist)
{
    to_inv_solar(plist); // 逆变-太阳能
    to_meter(plist);     // 电表
    to_duanluqi(plist);  // 断路器
    to_pingan(plist);    // 平安报
    to_yu(plist);        // 雨量水位
    to_water(plist);     // 水位 水位预警
    to_ht(plist);        // 箱内温湿
    to_od(plist);        // 开箱
    to_tc_hc(plist);     // 温湿
    to_ib(plist);        // 进线断路器
    to_sms(15, plist);
    to_gnss(10, plist);
    to_dam(6, plist);
    to_cam(10, plist);
    return plist.size();
}
